# 创建时间：2025/5/3 星期六 17:38
# 创建人：李德才
from collections.abc import Iterable, Iterator

""" 这两种方式创建的列表都会将所有元素存储在内存中，当列表中的元素数量非常多时，会占用大量的内存空间。 """
list = [1, 2, 3, 4, 5]
list2 = (x for x in range(1, 10))
for i in list2:
    print(i)
print(list)

""" 使用生成器可以节省内存空间，因为生成器是按需生成元素的，而不是一次性生成所有元素。 """
list3 = (x for x in range(1, 10))
print(next(list3))
print(next(list3))
print(next(list3))
print(next(list3))
print(list3.__next__())

list4 = (x for x in range(1, 10))

for i in list4:
    print(i)


def fibonacci(n):
    a, b = 0, 1
    for _ in range(n):
        """ yield 关键字用于定义生成器函数，它可以将 yield 后面对象作为生成器生成的对象返回。 """
        yield a
        a, b = b, a + b
    return "done"


fib = fibonacci(10)
for i in fib:
    print("fib", i)

""" 
可以作用于or   循环的对象都是 Iterable 类型 
可以作用于next() 函数的对象都是 Iterator 类型
Iterable 类型的对象可以通过 iter() 函数转换为 Iterator 类型的对象。
Iterator 类型的对象可以通过 next() 函数获取下一个元素。
Iterator 类型的对象可以通过 for 循环遍历所有元素。
Iterator 类型的对象可以通过 __next__() 方法获取下一个元素。
Iterator 类型的对象可以通过 __iter__() 方法转换为 Iterable 类型的对象。
---------------------------------------------------------------
Iterator 表示的是一个惰性计算的序列，只有在需要时才会计算下一个元素。
"""

print(isinstance(list, Iterable))  # 判断是否可迭代

print(isinstance(list, Iterator))  # 判断是否迭代器
print(isinstance(iter(list), Iterator))
